package es.wtestgen.services;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Restrictions;

import es.wtestgen.domain.Alumno;
import es.wtestgen.domain.Examen;
import es.wtestgen.domain.ExamenResuelto;
import es.wtestgen.domain.Respuesta;
import es.wtestgen.util.HibernateUtil;

public class ExamenResueltoDAO {
		
		private static final Log log = LogFactory.getLog(ExamenResueltoDAO.class);
		
		public ExamenResueltoDAO(){
			
		}
		
		
		public boolean eliminar(int codExam){
			Transaction tx = null;
			Session session = HibernateUtil.currentSession();
			boolean eliminado = false;
			try{			
				tx = session.beginTransaction();
				ExamenResuelto examenResu = (ExamenResuelto)session.get(ExamenResuelto.class, codExam);
				session.delete(examenResu);
				tx.commit();
				
				eliminado = true;
			}catch(Exception e){
				try{
					tx.rollback();
					e.printStackTrace();
				}catch(Exception e2){
					e2.printStackTrace();					
				}
			}finally{
					HibernateUtil.closeSession();
			}
			return eliminado;
		}
		
			
		public List findAll(){
			List lista = new ArrayList();
			Criteria criteria = null;
			
			try{
				Session session = HibernateUtil.currentSession();
				criteria = session.createCriteria(ExamenResuelto.class);				
				lista = criteria.list();		
			}catch(HibernateException e){
				log.error("_____Error al obtener la todos los registros de la clase ExamenResuelto",e);
				throw new HibernateException(e);						
			}	
			return lista;
		}
		
		
		public List findById(String cod){
			List lista = new ArrayList();
			Criteria criteria = null;
			int id = Integer.parseInt(cod);
			
			try{
				Session session = HibernateUtil.currentSession();
				criteria = session.createCriteria(ExamenResuelto.class);				
				criteria.add(Restrictions.eq("codExamResu", id));
				lista = criteria.list();		
			}catch(HibernateException e){
				log.error("_____Error al obtener el registro de la clase ExamenResuelto con id: " + cod,e);
				throw new HibernateException(e);						
			}	
			return lista;
		}
		
		public List findByExamen(Examen examen){
			List lista = new ArrayList();
			Criteria criteria = null;
						
			try{
				Session session = HibernateUtil.currentSession();
				criteria = session.createCriteria(ExamenResuelto.class);				
				criteria.add(Restrictions.eq("examen", examen));
				lista = criteria.list();		
			}catch(HibernateException e){
				log.error("_____Error al obtener el registro de la clase ExamenResuelto con codigo de Examen: " + examen.getCodExam(),e);
				throw new HibernateException(e);						
			}	
			return lista;
		}
		
		
		public List findByExamenYAlumno(Examen examen,Alumno alumno){
			List lista = new ArrayList();
			Criteria criteria = null;
						
			try{
				Session session = HibernateUtil.currentSession();
				criteria = session.createCriteria(ExamenResuelto.class);				
				criteria.add(Restrictions.eq("examen", examen));
				criteria.add(Restrictions.eq("alumno", alumno));
				lista = criteria.list();		
			}catch(HibernateException e){
				log.error("_____Error al obtener el registro de la clase ExamenResuelto con codigo de Examen: " + examen.getCodExam(),e);
				throw new HibernateException(e);						
			}	
			return lista;
		}
		

		
		public boolean guardarExamenResuelto(ExamenResuelto exam){
			Transaction tx = null;
			Session session = HibernateUtil.currentSession();
			boolean guardado = false;
			Set<Respuesta> respuestas = null;
					
			try{			
				tx = session.beginTransaction();
				session.clear();
				//session.flush();
				session.saveOrUpdate(exam);
				
				tx.commit();
								
				respuestas = exam.getRespuestasResu();
				for (Iterator iterator = respuestas.iterator(); iterator
						.hasNext();) {
					Respuesta respuesta = (Respuesta) iterator.next();
					Respuesta r = (Respuesta)session.get(Respuesta.class, respuesta.getCodResp());
					r.getExamenesResueltos().add(exam);
					session.saveOrUpdate(r);				
										
					Session session2 = HibernateUtil.currentSession();
					Transaction tx2 = null;
					try{
						tx2 = session2.beginTransaction();
						
						session2.update(r); 
						
						tx2.commit();						
					}catch(Exception e){
						try{
							tx2.rollback();
							e.printStackTrace();
						}catch(Exception e2){
							e2.printStackTrace();							
						}
					}				
				}
				
				//session.saveOrUpdate(exam);
				
				//tx.commit();
				guardado = true;
			}catch(Exception e){
				try{
					tx.rollback();
					e.printStackTrace();
				}catch(Exception e2){
					e2.printStackTrace();					
				}
			}finally{
					HibernateUtil.closeSession();
			}
			return guardado;
		}


		public List findByAlumno(Alumno alumno) {
			List lista = new ArrayList();
			Criteria criteria = null;
						
			try{
				Session session = HibernateUtil.currentSession();
				criteria = session.createCriteria(ExamenResuelto.class);				
				criteria.add(Restrictions.eq("alumno", alumno));
				lista = criteria.list();		
			}catch(HibernateException e){
				log.error("_____Error al obtener el registro de la clase ExamenResuelto para el alumno: " + alumno.getNombre() + alumno.getApellidos(),e);
				throw new HibernateException(e);						
			}	
			return lista;
		}
		

}
